package game.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import common.config.exception.CustomException;
import common.model.po.GUserProduction;
import common.model.request.base.PaginationRequest;
import common.model.response.base.Result;
import game.mapper.GUserProductionMapper;
import game.model.converter.GUserProductionConverter;
import game.model.request.GenerateProductionNameRequest;
import game.model.request.ModifyProductionNameRequest;
import game.model.request.SaveUserProductionRequest;
import game.model.request.SearchUserProductionRequest;
import game.model.vo.ProductionCollectionVo;
import game.service.GUserProductionService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 服务实现类
 *
 * @author 米泽鹏
 * @since 2023-09-26 下午 10:15
 */
@Service
public class GUserProductionServiceImpl extends ServiceImpl<GUserProductionMapper, GUserProduction> implements GUserProductionService {

	@Resource
	private GUserProductionMapper mapper;

	@Override
	public Page<ProductionCollectionVo> pageUserProduction(PaginationRequest<SearchUserProductionRequest, GUserProduction> paginationRequest) {
		return mapper.pageUserProduction(paginationRequest.buildPage(), paginationRequest.getParams());
	}

	@Override
	public Result<?> saveUserProduction(SaveUserProductionRequest request) {
		// 检查产线名称是否重复
		if (lambdaQuery().eq(GUserProduction::getProductionName, request.getProductionName()).eq(GUserProduction::getUserId, request.getUserId()).count() > 0) {
			return Result.successWithData("产线名称重复");
		}
		GUserProduction userProduction = GUserProductionConverter.saveRequestToPo(request);
		userProduction.insert();
		return Result.success();
	}

	@Override
	public Result<?> deleteUserProduction(Long id) {
		removeById(id);
		return Result.success();
	}

	@Override
	public Result<?> modifyProductionName(ModifyProductionNameRequest request) {
		// 检查产线名称是否重复
		if (lambdaQuery().eq(GUserProduction::getProductionName, request.getProductionName()).eq(GUserProduction::getUserId, request.getUserId()).count() > 0) {
			return Result.successWithData("产线名称重复");
		}
		lambdaUpdate().eq(GUserProduction::getId, request.getProductionId()).set(GUserProduction::getProductionName, request.getProductionName()).update();
		return Result.success();
	}

	@Override
	public Result<String> generateProductionName(GenerateProductionNameRequest request) {
		// 如果不重复，直接返回前端生成的产线名称
		String originalProductionName = request.getProductionName();
		if (lambdaQuery().eq(GUserProduction::getUserId, request.getUserId()).eq(GUserProduction::getType, request.getType()).eq(GUserProduction::getProductionName, originalProductionName).count() == 0) {
			return Result.successWithData(originalProductionName);
		}
		// 如果重复，生成新的不重复的产线名称
		List<GUserProduction> currentUserProductionList = lambdaQuery().eq(GUserProduction::getUserId, request.getUserId()).eq(GUserProduction::getType, request.getType()).list();
		int suffix = 2;
		do {
			if (suffix == Integer.MAX_VALUE) {
				throw new CustomException("收藏的产线数量已达到最大值：" + Integer.MAX_VALUE);
			}
			request.setProductionName(originalProductionName + " (" + suffix + ")");
			suffix++;
		} while (currentUserProductionList.stream().anyMatch(userProduction -> request.getProductionName().equals(userProduction.getProductionName())));
		return Result.successWithData(request.getProductionName());
	}

}
